package com.gobang.common.config;

import com.gobang.common.filter.JWTAuthenticationFilter;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;

/**
 * Spring Security配置类
 * 配置JWT认证和安全过滤规则
 * 
 * @author System
 * @version 1.0.0
 */
@Configuration
@EnableWebSecurity // 启动 Spring Security 的 web 安全支持
@RequiredArgsConstructor
public class SecurityConfig {

    private final JWTAuthenticationFilter jwtAuthenticationFilter;

    /**
     * 配置安全过滤器链
     * 集成JWT认证，配置请求授权规则
     *
     * @param http HttpSecurity对象
     * @return SecurityFilterChain  处理 HTTP 请求的安全逻辑
     * @throws Exception 配置异常
     */
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            // 禁用CSRF（使用JWT无需CSRF保护）
            .csrf(AbstractHttpConfigurer::disable)

            // 配置会话管理为无状态（JWT无需会话）
            .sessionManagement(session -> session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            )
            
            // 配置请求授权
            .authorizeHttpRequests(authz -> authz
                // 公开接口 - 无需认证
                .requestMatchers(
                    "/api/auth/login",           // 登录接口
                    "/api/auth/validate",        // Token验证接口（用于前端检查）
                    "/api/users/register",        // 用户注册接口
                    "/test/**",                  // 测试接口
                    "/actuator/**",              // 监控接口
                    "/error"                     // 错误页面
                ).permitAll()  // 允许列出的路径匿名访问
                
                // 静态资源 - 无需认证
                .requestMatchers(
                    "/",                         // 首页
                    "/index.html",               // 主页面
                    "/static/**",                // 静态资源
                    "/css/**",                   // CSS资源
                    "/js/**",                    // JavaScript资源
                    "/images/**",                // 图片资源
                    "/webjars/**",               // WebJars资源
                    "/testws.html",
                    "/**.html","/**.css","/**.js",
                    "/favicon.ico"               // 网站图标
                ).permitAll()
                
                // WebSocket连接端点 - 无需HTTP认证（WebSocket有自己的认证）
                .requestMatchers("/websocket/**").permitAll()
                
                // 其他所有请求都需要认证
                .anyRequest().authenticated() //其他所有请求都需要认证
            )
            
            // 添加JWT认证过滤器
            .addFilterBefore(
                    jwtAuthenticationFilter,
                    UsernamePasswordAuthenticationFilter.class);

        return http.build();
    }


}